home *** CD-ROM | disk | FTP | other *** search
- <?xml version="1.0"?>
-
-
- <bindings id="urlbarBindings" xmlns="http://www.mozilla.org/xbl">
-
- <binding id="urlbar" extends="chrome://global/content/bindings/autocomplete.xml#autocomplete">
- <implementation implements="nsIObserver, nsIDOMEventListener">
- <constructor><![CDATA[
- this._prefs = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService)
- .getBranch("browser.urlbar.")
- .QueryInterface(Components.interfaces.nsIPrefBranch2);
-
- this._prefs.addObserver("", this, false);
- this.clickSelectsAll = this._prefs.getBoolPref("clickSelectsAll");
- this.doubleClickSelectsAll = this._prefs.getBoolPref("doubleClickSelectsAll");
- this.completeDefaultIndex = this._prefs.getBoolPref("autoFill");
-
- this._urlTooltip = document.getElementById("urlTooltip");
-
- this.inputField.controllers.insertControllerAt(0, this._copyCutController);
- this.inputField.addEventListener("mousedown", this, false);
- this.inputField.addEventListener("mousemove", this, false);
- this.inputField.addEventListener("mouseout", this, false);
- ]]></constructor>
-
- <destructor><![CDATA[
- this._prefs.removeObserver("", this);
- this._prefs = null;
- this.inputField.controllers.removeController(this._copyCutController);
- this.inputField.removeEventListener("mousedown", this, false);
- this.inputField.removeEventListener("mousemove", this, false);
- this.inputField.removeEventListener("mouseout", this, false);
- ]]></destructor>
-
- <method name="_initURLTooltip">
- <body><![CDATA[
- if (this.focused || this.value == "")
- return;
- if (this._tooltipTimer)
- clearTimeout(this._tooltipTimer);
- this._tooltipTimer = setTimeout(function (self) {
- self._tooltipTimer = 0;
- var label = self._urlTooltip.firstChild;
- label.value = self.value;
- var bO = self.boxObject;
- self._urlTooltip.maxWidth = bO.width;
- self._urlTooltip.showPopup(self, bO.screenX, bO.screenY + bO.height, "tooltip");
- }, 700, this);
- ]]></body>
- </method>
-
- <method name="_hideURLTooltip">
- <body><![CDATA[
- if (this._tooltipTimer) {
- clearTimeout(this._tooltipTimer);
- this._tooltipTimer = 0;
- }
- this._urlTooltip.hidePopup();
- ]]></body>
- </method>
-
- <method name="onDragOver">
- <body>
- return true;
- </body>
- </method>
-
- <method name="onDrop">
- <parameter name="aEvent"/>
- <parameter name="aXferData"/>
- <parameter name="aDragSession"/>
- <body><![CDATA[
- var url = transferUtils.retrieveURLFromData(aXferData.data, aXferData.flavour.contentType);
-
- // The URL bar automatically handles inputs with newline characters,
- // so we can get away with treating text/x-moz-url flavours as text/unicode.
- if (url) {
- nsDragAndDrop.dragDropSecurityCheck(aEvent, aDragSession, url);
-
- this.value = url;
- SetPageProxyState("invalid");
- try {
- urlSecurityCheck(this.value,
- gBrowser.contentPrincipal,
- Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);
- } catch (ex) {
- return;
- }
- handleURLBarCommand();
- }
- ]]></body>
- </method>
-
- <method name="getSupportedFlavours">
- <body><![CDATA[
- var flavourSet = new FlavourSet();
-
- // Favor text/x-moz-url since text/unicode coming from Win32 1.8 branch
- // drops contains URL\ntext. The previous comment here said that
- // plain text drops often come with text/x-moz-url flavor, but I
- // haven't seen that, so hopefully that behavior has changed.
- flavourSet.appendFlavour("text/x-moz-url");
- flavourSet.appendFlavour("text/unicode");
- flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
- return flavourSet;
- ]]></body>
- </method>
-
- <field name="_copyCutController"><![CDATA[
- ({
- urlbar: this,
- doCommand: function(aCommand) {
- var urlbar = this.urlbar;
- var start = urlbar.selectionStart;
- var end = urlbar.selectionEnd;
- if (start == end)
- return;
- var val;
- if (start == 0 && end == urlbar.textLength) {
- val = urlbar.value;
-
- // If the entire value is selected and it's a valid non-javascript,
- // non-data URI, encode it.
- var uri;
- if (urlbar.getAttribute("pageproxystate") == "valid") {
- var ioService = Cc["@mozilla.org/network/io-service;1"]
- .getService(Ci.nsIIOService);
- try {
- uri = ioService.newURI(val, null, null);
- } catch (e) {}
- }
- if (uri && !uri.schemeIs("javascript") && !uri.schemeIs("data"))
- val = uri.spec;
-
- if (aCommand == "cmd_cut" && this.isCommandEnabled(aCommand)) {
- urlbar.value = "";
- SetPageProxyState("invalid");
- }
- } else {
- val = urlbar.value.substring(start, end);
- if (aCommand == "cmd_cut" && this.isCommandEnabled(aCommand)) {
- urlbar.value = urlbar.value.substring(0, start) + urlbar.value.substring(end);
- urlbar.selectionStart = urlbar.selectionEnd = start;
- SetPageProxyState("invalid");
- }
- }
- Cc["@mozilla.org/widget/clipboardhelper;1"]
- .getService(Ci.nsIClipboardHelper)
- .copyString(val);
- },
- supportsCommand: function(aCommand) {
- switch (aCommand) {
- case "cmd_copy":
- case "cmd_cut":
- return true;
- }
- return false;
- },
- isCommandEnabled: function(aCommand) {
- return this.supportsCommand(aCommand) &&
- (aCommand != "cmd_cut" || !this.urlbar.readOnly) &&
- this.urlbar.selectionStart < this.urlbar.selectionEnd;
- },
- onEvent: function(aEventName) {}
- })
- ]]></field>
-
- <method name="observe">
- <parameter name="aSubject"/>
- <parameter name="aTopic"/>
- <parameter name="aData"/>
- <body><![CDATA[
- if (aTopic == "nsPref:changed") {
- switch(aData) {
- case "clickSelectsAll":
- case "doubleClickSelectsAll":
- this[aData] = this._prefs.getBoolPref(aData);
- break;
- case "autoFill":
- this.completeDefaultIndex = this._prefs.getBoolPref(aData);
- break;
- }
- }
- ]]></body>
- </method>
-
- <method name="handleEvent">
- <parameter name="aEvent"/>
- <body><![CDATA[
- switch (aEvent.type) {
- case "mousedown":
- if (this.doubleClickSelectsAll &&
- aEvent.button == 0 && aEvent.detail == 2) {
- this.editor.selectAll();
- aEvent.preventDefault();
- }
- break;
- case "mousemove":
- this._initURLTooltip();
- break;
- case "mouseout":
- this._hideURLTooltip();
- break;
- }
- ]]></body>
- </method>
-
- <property name="textValue"
- onget="return this.value;">
- <setter>
- <![CDATA[
- try {
- let uri = Cc["@mozilla.org/network/io-service;1"].
- getService(Ci.nsIIOService).
- newURI(val, null, null);
- val = losslessDecodeURI(uri);
- } catch (ex) { }
- this.value = val;
-
- // Completing a result should simulate the user typing the result, so
- // fire an input event.
- let evt = document.createEvent("UIEvents");
- evt.initUIEvent("input", true, false, window, 0);
- this.mIgnoreInput = true;
- this.dispatchEvent(evt);
- this.mIgnoreInput = false;
-
- return this.value;
- ]]>
- </setter>
- </property>
- </implementation>
-
- <handlers>
- <handler event="focus" phase="capturing" action="this._hideURLTooltip();"/>
- <handler event="dragover" phase="capturing" action="nsDragAndDrop.dragOver(event, this);"/>
- <handler event="dragdrop" phase="capturing" action="nsDragAndDrop.drop(event, this);"/>
- </handlers>
-
- </binding>
-
- <!-- Note: this binding is applied to the autocomplete popup used in the Search bar and in web page content -->
- <binding id="browser-autocomplete-result-popup" extends="chrome://global/content/bindings/autocomplete.xml#autocomplete-result-popup">
- <implementation>
- <method name="openAutocompletePopup">
- <parameter name="aInput"/>
- <parameter name="aElement"/>
- <body>
- <![CDATA[
- // initially the panel is hidden
- // to avoid impacting startup / new window performance
- aInput.popup.hidden = false;
-
- // this method is defined on the base binding
- this._openAutocompletePopup(aInput, aElement);
- ]]></body>
- </method>
-
- <method name="onPopupClick">
- <parameter name="aEvent"/>
- <body><![CDATA[
- // Ignore all right-clicks
- if (aEvent.button == 2)
- return;
-
- var controller = this.view.QueryInterface(Components.interfaces.nsIAutoCompleteController);
-
- // Check for unmodified left-click, and use default behavior
- if (aEvent.button == 0 && !aEvent.shiftKey && !aEvent.ctrlKey &&
- !aEvent.altKey && !aEvent.metaKey) {
- controller.handleEnter(true);
- return;
- }
-
- // Check for middle-click or modified clicks on the search bar
- var searchBar = BrowserSearch.searchBar;
- if (searchBar && searchBar.textbox == this.mInput) {
- // Handle search bar popup clicks
- var search = controller.getValueAt(this.selectedIndex);
-
- // close the autocomplete popup and revert the entered search term
- this.closePopup();
- controller.handleEscape();
-
- // Fill in the search bar's value
- searchBar.value = search;
-
- // open the search results according to the clicking subtlety
- var where = whereToOpenLink(aEvent, false, true);
- searchBar.doSearch(search, where);
- }
- ]]></body>
- </method>
- </implementation>
- </binding>
-
- <binding id="urlbar-rich-result-popup" extends="chrome://global/content/bindings/autocomplete.xml#autocomplete-rich-result-popup">
- <implementation>
- <field name="_maxResults">0</field>
-
- <field name="_bundle" readonly="true">
- Cc["@mozilla.org/intl/stringbundle;1"].
- getService(Ci.nsIStringBundleService).
- createBundle("chrome://browser/locale/places/places.properties");
- </field>
-
- <property name="maxResults" readonly="true">
- <getter>
- <![CDATA[
- if (!this._maxResults) {
- var prefService =
- Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefBranch);
- this._maxResults = prefService.getIntPref("browser.urlbar.maxRichResults");
- }
- return this._maxResults;
- ]]>
- </getter>
- </property>
-
- <method name="openAutocompletePopup">
- <parameter name="aInput"/>
- <parameter name="aElement"/>
- <body>
- <![CDATA[
- // initially the panel is hidden
- // to avoid impacting startup / new window performance
- aInput.popup.hidden = false;
-
- // this method is defined on the base binding
- this._openAutocompletePopup(aInput, aElement);
- ]]></body>
- </method>
-
- <method name="onPopupClick">
- <parameter name="aEvent"/>
- <body>
- <![CDATA[
- // Ignore right-clicks
- if (aEvent.button == 2)
- return;
-
- var controller = this.view.QueryInterface(Components.interfaces.nsIAutoCompleteController);
-
- // Check for unmodified left-click, and use default behavior
- if (aEvent.button == 0 && !aEvent.shiftKey && !aEvent.ctrlKey &&
- !aEvent.altKey && !aEvent.metaKey) {
- controller.handleEnter(true);
- return;
- }
-
- // Check for middle-click or modified clicks on the URL bar
- if (gURLBar && this.mInput == gURLBar) {
- var url = controller.getValueAt(this.selectedIndex);
-
- // close the autocomplete popup and revert the entered address
- this.closePopup();
- controller.handleEscape();
-
- // respect the usual clicking subtleties
- openUILink(url, aEvent);
- }
- ]]>
- </body>
- </method>
-
- <method name="createResultLabel">
- <parameter name="aTitle"/>
- <parameter name="aUrl"/>
- <parameter name="aType"/>
- <body>
- <![CDATA[
- var label = aTitle + " " + aUrl;
- // convert aType (ex: "ac-result-type-<aType>") to text to be spoke aloud
- // by screen readers. convert "tag" and "bookmark" to the localized versions,
- // but don't do anything for "favicon" (the default)
- if (aType != "favicon") {
- label += " " + this._bundle.GetStringFromName(aType + "ResultLabel");
- }
- return label;
- ]]>
- </body>
- </method>
-
- </implementation>
- </binding>
- </bindings>
-